{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5hIbr52I7Z7U"
   },
   "source": [
    "Deep Learning\n",
    "=============\n",
    "\n",
    "Assignment 1\n",
    "------------\n",
    "\n",
    "The objective of this assignment is to learn about simple data curation practices, and familiarize you with some of the data we'll be reusing later.\n",
    "\n",
    "This notebook uses the [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) dataset to be used with python experiments. This dataset is designed to look like the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset, while looking a little more like real data: it's a harder task, and the data is a lot less 'clean' than MNIST."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     }
    },
    "colab_type": "code",
    "collapsed": true,
    "id": "apJbCsBHl-2A"
   },
   "outputs": [],
   "source": [
    "# These are all the modules we'll be using later. Make sure you can import them\n",
    "# before proceeding further.\n",
    "from __future__ import print_function\n",
    "import imageio\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import sys\n",
    "import tarfile\n",
    "from IPython.display import display, Image\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from six.moves.urllib.request import urlretrieve\n",
    "from six.moves import cPickle as pickle\n",
    "\n",
    "# Config the matplotlib backend as plotting inline in IPython\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "jNWGtZaXn-5j"
   },
   "source": [
    "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labeled examples. Given these sizes, it should be possible to train models quickly on any machine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 186058,
     "status": "ok",
     "timestamp": 1444485672507,
     "user": {
      "color": "#1FA15D",
      "displayName": "Vincent Vanhoucke",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "05076109866853157986",
      "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg",
      "sessionId": "2a0a5e044bb03b66",
      "userId": "102167687554210253930"
     },
     "user_tz": 420
    },
    "id": "EYRJ4ICW6-da",
    "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found and verified ./notMNIST_large.tar.gz\n",
      "Found and verified ./notMNIST_small.tar.gz\n"
     ]
    }
   ],
   "source": [
    "url = 'https://commondatastorage.googleapis.com/books1000/'\n",
    "last_percent_reported = None\n",
    "data_root = '.' # Change me to store data elsewhere\n",
    "\n",
    "def download_progress_hook(count, blockSize, totalSize):\n",
    "  \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n",
    "  slow internet connections. Reports every 5% change in download progress.\n",
    "  \"\"\"\n",
    "  global last_percent_reported\n",
    "  percent = int(count * blockSize * 100 / totalSize)\n",
    "\n",
    "  if last_percent_reported != percent:\n",
    "    if percent % 5 == 0:\n",
    "      sys.stdout.write(\"%s%%\" % percent)\n",
    "      sys.stdout.flush()\n",
    "    else:\n",
    "      sys.stdout.write(\".\")\n",
    "      sys.stdout.flush()\n",
    "      \n",
    "    last_percent_reported = percent\n",
    "        \n",
    "def maybe_download(filename, expected_bytes, force=False):\n",
    "  \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n",
    "  dest_filename = os.path.join(data_root, filename)\n",
    "  if force or not os.path.exists(dest_filename):\n",
    "    print('Attempting to download:', filename) \n",
    "    filename, _ = urlretrieve(url + filename, dest_filename, reporthook=download_progress_hook)\n",
    "    print('\\nDownload Complete!')\n",
    "  statinfo = os.stat(dest_filename)\n",
    "  if statinfo.st_size == expected_bytes:\n",
    "    print('Found and verified', dest_filename)\n",
    "  else:\n",
    "    raise Exception(\n",
    "      'Failed to verify ' + dest_filename + '. Can you get to it with a browser?')\n",
    "  return dest_filename\n",
    "\n",
    "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n",
    "test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cC3p0oEyF8QT"
   },
   "source": [
    "Extract the dataset from the compressed .tar.gz file.\n",
    "This should give you a set of directories, labeled A through J."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 186055,
     "status": "ok",
     "timestamp": 1444485672525,
     "user": {
      "color": "#1FA15D",
      "displayName": "Vincent Vanhoucke",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "05076109866853157986",
      "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg",
      "sessionId": "2a0a5e044bb03b66",
      "userId": "102167687554210253930"
     },
     "user_tz": 420
    },
    "id": "H8CBE-WZ8nmj",
    "outputId": "ef6c790c-2513-4b09-962e-27c79390c762"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./notMNIST_large already present - Skipping extraction of ./notMNIST_large.tar.gz.\n",
      "['./notMNIST_large/A', './notMNIST_large/B', './notMNIST_large/C', './notMNIST_large/D', './notMNIST_large/E', './notMNIST_large/F', './notMNIST_large/G', './notMNIST_large/H', './notMNIST_large/I', './notMNIST_large/J']\n",
      "./notMNIST_small already present - Skipping extraction of ./notMNIST_small.tar.gz.\n",
      "['./notMNIST_small/A', './notMNIST_small/B', './notMNIST_small/C', './notMNIST_small/D', './notMNIST_small/E', './notMNIST_small/F', './notMNIST_small/G', './notMNIST_small/H', './notMNIST_small/I', './notMNIST_small/J']\n"
     ]
    }
   ],
   "source": [
    "num_classes = 10\n",
    "np.random.seed(133)\n",
    "\n",
    "def maybe_extract(filename, force=False):\n",
    "  root = os.path.splitext(os.path.splitext(filename)[0])[0]  # remove .tar.gz\n",
    "  if os.path.isdir(root) and not force:\n",
    "    # You may override by setting force=True.\n",
    "    print('%s already present - Skipping extraction of %s.' % (root, filename))\n",
    "  else:\n",
    "    print('Extracting data for %s. This may take a while. Please wait.' % root)\n",
    "    tar = tarfile.open(filename)\n",
    "    sys.stdout.flush()\n",
    "    tar.extractall(data_root)\n",
    "    tar.close()\n",
    "  data_folders = [\n",
    "    os.path.join(root, d) for d in sorted(os.listdir(root))\n",
    "    if os.path.isdir(os.path.join(root, d))]\n",
    "  if len(data_folders) != num_classes:\n",
    "    raise Exception(\n",
    "      'Expected %d folders, one per class. Found %d instead.' % (\n",
    "        num_classes, len(data_folders)))\n",
    "  print(data_folders)\n",
    "  return data_folders\n",
    "  \n",
    "train_folders = maybe_extract(train_filename)\n",
    "test_folders = maybe_extract(test_filename)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4riXK3IoHgx6"
   },
   "source": [
    "---\n",
    "Problem 1\n",
    "---------\n",
    "\n",
    "Let's take a peek at some of the data to make sure it looks sensible. Each exemplar should be an image of a character A through J rendered in a different font. Display a sample of the images that we just downloaded. Hint: you can use the package IPython.display.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB0ElEQVR4nG3SO2uUQRjF8f/MOxuX\ngKyQiBAwxE5B8FKJnZcPENAiKMJaiKAfQCsLFRRriQTcgKBs4QUEFRGDYBMRxY3RIpomKEgSlV2M\nYfPO5Vi8ibquTzm/Ys48c6BrjOXUbOvN8aybwFJTVNLEULc5LspHRa+H/7GqgiRFTXXbgVypwKe2\n07KwvV5KRgIx14lZHLy/MdokA/Cx09j0VkFRrSUpaqTT+l/JK+rTrucK0v6O9/UVtriDB/Ja2f23\nVSblldTeBzXlWtr2O5BN5bt7glPi5LMyTSCurJkx9p5ypaAzuBIXlOv75jWz3JBXCjrHOuu4rFzf\nBlYtY1ReijqLhfVDj+Q137dmV+WlpCuVg9VLjz9HKWmuDGAzrslLUruxLElSUlTDANZyvTBJit77\nmKSgJziMzM2jwRWXR4TJAMRXnCGrHw4OUJItzpdNL9DEyd0eDg6CtRn8mPnw7v2XmZGxCD9xjA/7\nEpJj4fXky6l5gQv9CNq46rFYQjJj9UarqAKG1ZW7IxiEOVGzyVolBYzMFmyiF7cBkD1d60lKiSKn\ncpIoY6eJ3t4adXnQn0+/g7FMw9YFaXGQzi6Z8800UQH2vpg9xD/Vtwzs7IFf8DcdSRkFdyUAAAAA\nSUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display, Image\n",
    "\n",
    "\n",
    "display(Image(filename=\"notMNIST_small/A/Q0NXaWxkV29yZHMtQm9sZEl0YWxpYy50dGY=.png\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "PBdkjESPK8tw"
   },
   "source": [
    "Now let's load the data in a more manageable format. Since, depending on your computer setup you might not be able to fit it all in memory, we'll load each class into a separate dataset, store them on disk and curate them independently. Later we'll merge them into a single dataset of manageable size.\n",
    "\n",
    "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. \n",
    "\n",
    "A few images might not be readable, we'll just skip them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 30
      }
     ]
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 399874,
     "status": "ok",
     "timestamp": 1444485886378,
     "user": {
      "color": "#1FA15D",
      "displayName": "Vincent Vanhoucke",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "05076109866853157986",
      "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg",
      "sessionId": "2a0a5e044bb03b66",
      "userId": "102167687554210253930"
     },
     "user_tz": 420
    },
    "id": "h7q0XhG3MJdf",
    "outputId": "92c391bb-86ff-431d-9ada-315568a19e59"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./notMNIST_large/A.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/B.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/C.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/D.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/E.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/F.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/G.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/H.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/I.pickle already present - Skipping pickling.\n",
      "./notMNIST_large/J.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/A.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/B.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/C.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/D.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/E.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/F.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/G.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/H.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/I.pickle already present - Skipping pickling.\n",
      "./notMNIST_small/J.pickle already present - Skipping pickling.\n"
     ]
    }
   ],
   "source": [
    "image_size = 28  # Pixel width and height.\n",
    "pixel_depth = 255.0  # Number of levels per pixel.\n",
    "\n",
    "def load_letter(folder, min_num_images):\n",
    "  \"\"\"Load the data for a single letter label.\"\"\"\n",
    "  image_files = os.listdir(folder)\n",
    "  dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n",
    "                         dtype=np.float32)\n",
    "  print(folder)\n",
    "  num_images = 0\n",
    "  for image in image_files:\n",
    "    image_file = os.path.join(folder, image)\n",
    "    try:\n",
    "      image_data = (imageio.imread(image_file).astype(float) - \n",
    "                    pixel_depth / 2) / pixel_depth\n",
    "      if image_data.shape != (image_size, image_size):\n",
    "        raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n",
    "      dataset[num_images, :, :] = image_data\n",
    "      num_images = num_images + 1\n",
    "    except (IOError, ValueError) as e:\n",
    "      print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n",
    "    \n",
    "  dataset = dataset[0:num_images, :, :]\n",
    "  if num_images < min_num_images:\n",
    "    raise Exception('Many fewer images than expected: %d < %d' %\n",
    "                    (num_images, min_num_images))\n",
    "    \n",
    "  print('Full dataset tensor:', dataset.shape)\n",
    "  print('Mean:', np.mean(dataset))\n",
    "  print('Standard deviation:', np.std(dataset))\n",
    "  return dataset\n",
    "        \n",
    "def maybe_pickle(data_folders, min_num_images_per_class, force=False):\n",
    "  dataset_names = []\n",
    "  for folder in data_folders:\n",
    "    set_filename = folder + '.pickle'\n",
    "    dataset_names.append(set_filename)\n",
    "    if os.path.exists(set_filename) and not force:\n",
    "      # You may override by setting force=True.\n",
    "      print('%s already present - Skipping pickling.' % set_filename)\n",
    "    else:\n",
    "      print('Pickling %s.' % set_filename)\n",
    "      dataset = load_letter(folder, min_num_images_per_class)\n",
    "      try:\n",
    "        with open(set_filename, 'wb') as f:\n",
    "          pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n",
    "      except Exception as e:\n",
    "        print('Unable to save data to', set_filename, ':', e)\n",
    "  \n",
    "  return dataset_names\n",
    "\n",
    "train_datasets = maybe_pickle(train_folders, 45000)\n",
    "test_datasets = maybe_pickle(test_folders, 1800)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "vUdbskYE2d87"
   },
   "source": [
    "---\n",
    "Problem 2\n",
    "---------\n",
    "\n",
    "Let's verify that the data still looks good. Displaying a sample of the labels and images from the ndarray. Hint: you can use matplotlib.pyplot.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\niwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f5329fa0fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pickle_file = train_datasets[0]  # index 0 should be all As, 1 = all Bs, etc.\n",
    "with open(pickle_file, 'rb') as f:\n",
    "    letter_set = pickle.load(f)  # unpickle\n",
    "    sample_idx = np.random.randint(len(letter_set))  # pick a random image index\n",
    "    sample_image = letter_set[sample_idx, :, :]  # extract a 2D slice\n",
    "    plt.figure()\n",
    "    plt.imshow(sample_image)  # display it"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cYznx5jUwzoO"
   },
   "source": [
    "---\n",
    "Problem 3\n",
    "---------\n",
    "Another check: we expect the data to be balanced across classes. Verify that.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "LA7M7K22ynCt"
   },
   "source": [
    "Merge and prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune `train_size` as needed. The labels will be stored into a separate array of integers 0 through 9.\n",
    "\n",
    "Also create a validation dataset for hyperparameter tuning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 411281,
     "status": "ok",
     "timestamp": 1444485897869,
     "user": {
      "color": "#1FA15D",
      "displayName": "Vincent Vanhoucke",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "05076109866853157986",
      "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg",
      "sessionId": "2a0a5e044bb03b66",
      "userId": "102167687554210253930"
     },
     "user_tz": 420
    },
    "id": "s3mWgZLpyuzq",
    "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training: (200000, 28, 28) (200000,)\n",
      "Validation: (10000, 28, 28) (10000,)\n",
      "Testing: (10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "def make_arrays(nb_rows, img_size):\n",
    "  if nb_rows:\n",
    "    dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n",
    "    labels = np.ndarray(nb_rows, dtype=np.int32)\n",
    "  else:\n",
    "    dataset, labels = None, None\n",
    "  return dataset, labels\n",
    "\n",
    "def merge_datasets(pickle_files, train_size, valid_size=0):\n",
    "  num_classes = len(pickle_files)\n",
    "  valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n",
    "  train_dataset, train_labels = make_arrays(train_size, image_size)\n",
    "  vsize_per_class = valid_size // num_classes\n",
    "  tsize_per_class = train_size // num_classes\n",
    "    \n",
    "  start_v, start_t = 0, 0\n",
    "  end_v, end_t = vsize_per_class, tsize_per_class\n",
    "  end_l = vsize_per_class+tsize_per_class\n",
    "  for label, pickle_file in enumerate(pickle_files):       \n",
    "    try:\n",
    "      with open(pickle_file, 'rb') as f:\n",
    "        letter_set = pickle.load(f)\n",
    "        # let's shuffle the letters to have random validation and training set\n",
    "        np.random.shuffle(letter_set)\n",
    "        if valid_dataset is not None:\n",
    "          valid_letter = letter_set[:vsize_per_class, :, :]\n",
    "          valid_dataset[start_v:end_v, :, :] = valid_letter\n",
    "          valid_labels[start_v:end_v] = label\n",
    "          start_v += vsize_per_class\n",
    "          end_v += vsize_per_class\n",
    "                    \n",
    "        train_letter = letter_set[vsize_per_class:end_l, :, :]\n",
    "        train_dataset[start_t:end_t, :, :] = train_letter\n",
    "        train_labels[start_t:end_t] = label\n",
    "        start_t += tsize_per_class\n",
    "        end_t += tsize_per_class\n",
    "    except Exception as e:\n",
    "      print('Unable to process data from', pickle_file, ':', e)\n",
    "      raise\n",
    "    \n",
    "  return valid_dataset, valid_labels, train_dataset, train_labels\n",
    "            \n",
    "            \n",
    "train_size = 200000\n",
    "valid_size = 10000\n",
    "test_size = 10000\n",
    "\n",
    "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(\n",
    "  train_datasets, train_size, valid_size)\n",
    "_, _, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n",
    "\n",
    "print('Training:', train_dataset.shape, train_labels.shape)\n",
    "print('Validation:', valid_dataset.shape, valid_labels.shape)\n",
    "print('Testing:', test_dataset.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "GPTCnjIcyuKN"
   },
   "source": [
    "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     }
    },
    "colab_type": "code",
    "collapsed": true,
    "id": "6WZ2l2tN2zOL"
   },
   "outputs": [],
   "source": [
    "def randomize(dataset, labels):\n",
    "  permutation = np.random.permutation(labels.shape[0])\n",
    "  shuffled_dataset = dataset[permutation,:,:]\n",
    "  shuffled_labels = labels[permutation]\n",
    "  return shuffled_dataset, shuffled_labels\n",
    "train_dataset, train_labels = randomize(train_dataset, train_labels)\n",
    "test_dataset, test_labels = randomize(test_dataset, test_labels)\n",
    "valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "puDUTe6t6USl"
   },
   "source": [
    "---\n",
    "Problem 4\n",
    "---------\n",
    "Convince yourself that the data is still good after shuffling!\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "tIQJaJuwg5Hw"
   },
   "source": [
    "Finally, let's save the data for later reuse:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     }
    },
    "colab_type": "code",
    "collapsed": true,
    "id": "QiR_rETzem6C"
   },
   "outputs": [],
   "source": [
    "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n",
    "\n",
    "try:\n",
    "  f = open(pickle_file, 'wb')\n",
    "  save = {\n",
    "    'train_dataset': train_dataset,\n",
    "    'train_labels': train_labels,\n",
    "    'valid_dataset': valid_dataset,\n",
    "    'valid_labels': valid_labels,\n",
    "    'test_dataset': test_dataset,\n",
    "    'test_labels': test_labels,\n",
    "    }\n",
    "  pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n",
    "  f.close()\n",
    "except Exception as e:\n",
    "  print('Unable to save data to', pickle_file, ':', e)\n",
    "  raise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "cellView": "both",
    "colab": {
     "autoexec": {
      "startup": false,
      "wait_interval": 0
     },
     "output_extras": [
      {
       "item_id": 1
      }
     ]
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 413065,
     "status": "ok",
     "timestamp": 1444485899688,
     "user": {
      "color": "#1FA15D",
      "displayName": "Vincent Vanhoucke",
      "isAnonymous": false,
      "isMe": true,
      "permissionId": "05076109866853157986",
      "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg",
      "sessionId": "2a0a5e044bb03b66",
      "userId": "102167687554210253930"
     },
     "user_tz": 420
    },
    "id": "hQbLjrW_iT39",
    "outputId": "b440efc6-5ee1-4cbc-d02d-93db44ebd956"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Compressed pickle size: 690800441\n"
     ]
    }
   ],
   "source": [
    "statinfo = os.stat(pickle_file)\n",
    "print('Compressed pickle size:', statinfo.st_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "gE_cRAQB33lk"
   },
   "source": [
    "---\n",
    "Problem 5\n",
    "---------\n",
    "\n",
    "By construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\n",
    "Measure how much overlap there is between training, validation and test samples.\n",
    "\n",
    "Optional questions:\n",
    "- What about near duplicates between datasets? (images that are almost identical)\n",
    "- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "L8oww1s4JMQx"
   },
   "source": [
    "---\n",
    "Problem 6\n",
    "---------\n",
    "\n",
    "Let's get an idea of what an off-the-shelf classifier can give you on this data. It's always good to check that there is something to learn, and that it's a problem that is not so trivial that a canned solution solves it.\n",
    "\n",
    "Train a simple model on this data using 50, 100, 1000 and 5000 training samples. Hint: you can use the LogisticRegression model from sklearn.linear_model.\n",
    "\n",
    "Optional question: train an off-the-shelf model on all the data!\n",
    "\n",
    "---"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "default_view": {},
   "name": "1_notmnist.ipynb",
   "provenance": [],
   "version": "0.3.2",
   "views": {}
  },
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
